package br.com.bacabeleireiros.sysbeleza.controller;

import java.io.Serializable;
import java.util.List;
import java.util.TimeZone;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.bacabeleireiros.sysbeleza.entity.Caixa;
import br.com.bacabeleireiros.sysbeleza.entity.CaixaMovimento;
import br.com.bacabeleireiros.sysbeleza.entity.FormaPagamento;
import br.com.bacabeleireiros.sysbeleza.entity.TipoCaixaMovimento;
import br.com.bacabeleireiros.sysbeleza.service.ICaixaMovimentoService;
import br.com.bacabeleireiros.sysbeleza.service.ICaixaService;
import br.com.bacabeleireiros.sysbeleza.service.IFormaPagamentoService;
import br.com.bacabeleireiros.sysbeleza.service.ITipoCaixaMovimentoService;
import br.com.bacabeleireiros.util.controller.BaseBean;

@ManagedBean(name = "caixaMovimentoMB")
@ViewScoped
public class caixaMovimentoMB extends BaseBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private CaixaMovimento caixaMovimento;
	private List<TipoCaixaMovimento> listaTipoCaixaMovimento;
	private List<CaixaMovimento> listaCaixaMovimento;
	private Caixa caixaAberto;
	private List<FormaPagamento> listaFormaPagamento;

	@ManagedProperty("#{tipoCaixaMovimentoService}")
	private ITipoCaixaMovimentoService tipoCaixaMovimentoService;
	
	@ManagedProperty("#{caixaMovimentoService}")
	private ICaixaMovimentoService caixaMovimentoService;	
	
	@ManagedProperty("#{caixaService}")
	private ICaixaService caixaService;		
	
	@ManagedProperty("#{formaPagamentoService}")
	private IFormaPagamentoService formaPagamentoService;			
	
	public void setFormaPagamentoService(
			IFormaPagamentoService formaPagamentoService) {
		this.formaPagamentoService = formaPagamentoService;
	}

	public caixaMovimentoMB() {
		inicializa();
	}
	
	@PostConstruct
	public void init() {
		listaTipoCaixaMovimento = tipoCaixaMovimentoService.getTipoCaixaMovimento();		
		listaFormaPagamento = formaPagamentoService.getFormaPagamento();
		caixaAberto = caixaService.getCaixaAberto();
		listaCaixaMovimento = caixaMovimentoService.getAllCaixaMovimento(caixaAberto.getIdCaixa());
	}

	public void inicializa() {
		caixaMovimento = new CaixaMovimento();
	}
	
	public void salva() {
		caixaMovimento.getUsuario().setIdUsuario(1L);
		caixaMovimento.setCaixa(caixaAberto); 
		caixaMovimento = caixaMovimentoService.salva(caixaMovimento);
		listaCaixaMovimento = caixaMovimentoService.getAllCaixaMovimento(caixaAberto.getIdCaixa());
		inicializa();
	}
	
	public void fechaCaixa() {
		getPaginaAtual().execute("PF('dlgConfirmaFechamento').show();");
	}

	public void confirmaFechaCaixa() {
		try {
			caixaAberto = caixaService.fechaCaixa(caixaAberto);
			listaCaixaMovimento = caixaMovimentoService.getAllCaixaMovimento(caixaAberto.getIdCaixa());
			addInfoMessage("Caixa fechado com Sucesso"); 
		} catch (Exception e) {
			e.printStackTrace();	
			addErrorMessage("Erro ao fechar Caixa");
		}
	}
	
	public Double getTotalCaixaAberto() {
		return caixaMovimentoService.getTotalCaixaAberto(caixaAberto.getIdCaixa());
	}

	
	// gets e sets 
	
    public TimeZone getTimeZone() {
    	return TimeZone.getDefault();
    }	
	
	public CaixaMovimento getCaixaMovimento() {
		return caixaMovimento;
	}

	public void setCaixaMovimento(CaixaMovimento caixaMovimento) {
		this.caixaMovimento = caixaMovimento;
	}

	public List<TipoCaixaMovimento> getListaTipoCaixa() {
		return listaTipoCaixaMovimento;
	}

	public void setListaTipoCaixa(List<TipoCaixaMovimento> listaTipoCaixa) {
		this.listaTipoCaixaMovimento = listaTipoCaixa;
	}

	public List<CaixaMovimento> getListaCaixa() {
		return listaCaixaMovimento;
	}

	public void setListaCaixaMovimento(List<CaixaMovimento> listaCaixaMovimento) {
		this.listaCaixaMovimento = listaCaixaMovimento;
	}

	public void setTipoCaixaMovimentoService(ITipoCaixaMovimentoService tipoCaixaMovimentoService) {
		this.tipoCaixaMovimentoService = tipoCaixaMovimentoService;
	}

	public void setCaixaMovimentoService(ICaixaMovimentoService caixaMovimentoService) {
		this.caixaMovimentoService = caixaMovimentoService;
	}

	public Caixa getCaixaAberto() {
		return caixaAberto;
	}

	public void setCaixaAberto(Caixa caixaAberto) {
		this.caixaAberto = caixaAberto;
	}

	public void setCaixaService(ICaixaService caixaService) {
		this.caixaService = caixaService;
	}

	public List<FormaPagamento> getListaFormaPagamento() {
		return listaFormaPagamento;
	}

	public void setListaFormaPagamento(List<FormaPagamento> listaFormaPagamento) {
		this.listaFormaPagamento = listaFormaPagamento;
	}

}
